treap有点难写啊
fx treap好!(没有引用!)
那么常数大也没什么办法。。
fx treap的主体:
(假如要写多颗平衡树,把这个东西封装一下就好了)
rt:这颗树的根的编号
tot:总点数(删除的点不会消失,只是它的编号不再被使用了)
ls:左孩子
rs:右孩子
val:关键码(平衡树存的值)
pri:随机的优先级比较值
sz:点数(相同的值并没有合并到一起)
加入一个新的点:
更新节点的信息:(更改了树的结构的时候需要更新,fx treap需要在merge和split的时候更新)
合并(merge)两颗fx,要求左边的fx的每个点的关键码小于右边的fx的每个点的关键码
分裂(split)一颗fx,可以按值分裂,也可以按排名分裂,这里将键值<=x的分成左树,其余分成右树
split操作会得到两个值,rt_l表示左树的根的编号,rt_r表示右树的根的编号(这样写没有返回值,注意这两个值的变化,要即时的把值存下来,每次split之后他们的值就变了)
拥有了merge和split的fx treap,仍然拥有treap的一切性质,仍然可以使用treap的一切函数
fx treap独特之处在于,它抛弃了旋转操作,那么treap的insert和delete就不适用于fx treap了(只有这两个操作是需要zag和zig的)
插入:
删除:
短小精悍,那么其他操作也可以考虑用fx特有的merge和split来完成(常数大)
求键值为x的最小排名(相同的不算):
求排名第k的键值://并不能优化这个过程。。
求前驱后继:
清空: